package com.cuvretool;

import java.awt.Graphics;
import java.awt.event.KeyEvent;
import java.util.ArrayList;

import com.cuvretool.model.detail.ModelGroup;
import com.cuvretool.utils.Vector2;
import com.cuvretool.view.draw.DisplayDraw;
/**
 * 数据与视图的对接口
 * since 2015年5月21日 下午11:48:31
 * boy
 */
public class ModelInputHandleListener implements Base,InputListener {

	// ===========================================================
	// Constants
	// ===========================================================

	// ===========================================================
	// Fields
	// ===========================================================
	/**数据区*/
	protected Model mModel;
	/**曲线视图坐标转换*/
	private DisplayDraw mDisplayDraw;
	// ===========================================================
	// Constructors
	// ===========================================================

	// ===========================================================
	// Getter & Setter
	// ===========================================================
	/**
	 * 设置数据区
	 * @param model
	 */
	public void setModel(Model model){
		mModel = model;
	}
	/**
	 * 设置曲线视图坐标转换
	 * @param displayDraw
	 */
	public void setDisplayDraw(DisplayDraw displayDraw){
		mDisplayDraw = displayDraw;
	}
	/**
	 * 设置操作面板树结构参照骨架
	 */
	public void setOperateTree(ArrayList<ModelGroup> groups){
		View.getViewInputHandleListener().setOperateTree(groups);
	}
	// ===========================================================
	// Methods for/from SuperClass/Interfaces
	// ===========================================================
	@Override
	public void init() {
		// TODO Auto-generated method stub
		
	}
	
	@Override
	public void run() {
		if(mDisplayDraw != null){
			mModel.run();
			mDisplayDraw.setPoints(mModel.getDrawPoints());
			mDisplayDraw.setLines(mModel.getDrawLines());
			mDisplayDraw.setPolygon(mModel.getDrawPolygons());
			mDisplayDraw.setString(mModel.getDrawStrings());
			mDisplayDraw = null;
		}
	}
	
	@Override
	public void over() {
		// TODO Auto-generated method stub
		
	}
	// ===========================================================
	// Methods
	// ===========================================================
	/**
	 * for that world
	 * @param g
	 */
	public void DrawTheWorld(Graphics g){
		mModel.DrawTheWorld(g);
	}
	/**
	 * 双击新增点
	 * @param pos
	 * @return true新增点，false未新增
	 */
	public boolean onClickDouble(Vector2 pos){
		return mModel.isIncreaseOk(pos);
	}
	/**
	 * 单击选中点
	 * @param pos
	 * @return true单击中点，false未点击中
	 */
	public boolean onClickOnly(Vector2 pos){
		return mModel.isClickPoint(pos);
	}
	/**
	 * 按下鼠标左键或右键
	 * @param button
	 * @param pos
	 * @return
	 */
	public boolean onPressed(int button, Vector2 pos){
		return mModel.isPressed(button, pos);
	}
	/**
	 * 点移动
	 * @param pos	移动的位置坐标
	 * @return
	 */
	public boolean onDragPoint(Vector2 pos){
		return mModel.isDragPoint(pos);
	}
	/**
	 * 鼠标up事件，释放对应的状态
	 * @param button
	 */
	public void onReleased(int button){
		mModel.isReleased(button);
	}
	/**
	 * 鼠标移动
	 * @param pos	移动的位置坐标
	 * @return
	 */
	public boolean onMove(Vector2 pos){
		return mModel.isMove(pos);
	}
	/**
	 * 键盘按下事件
	 * @param ｅ
	 * @return	true需要更新，false不需要更新
	 */
	public boolean onKeyPressed(KeyEvent e){
		return mModel.isKeyPressed(e);
	}
	/**
	 * 键盘释放事件
	 * @param ｅ
	 * @return	true需要更新，false不需要更新
	 */
	public boolean onKeyReleased(KeyEvent e){
		return mModel.isKeyReleased(e);
	}
	/**
	 * 更新操作面板树
	 */
	public void updateOperateTree(){
		View.getViewInputHandleListener().updateOperateTree();
	}
	// ===========================================================
	// Inner and Anonymous Classes
	// ===========================================================
}
